home *** CD-ROM | disk | FTP | other *** search
- Procedure ReadS (Var NewIn : String; OldIn : String; X,Y,Colr,MaxLen : Byte;
- ValidChars : ChSet; FChar : Char);
-
- (* NewIn = String entered by user, or default string if
- nothing new entered. Self-modified.
- OldIn = Default or old data entered
- X,Y = Coordinates of beginning point to read
- Colr = Color of input
- MaxLen = Maximum length of input
- ValidChars = A Set of Char that outlines which keys can be
- used in entering string. ie: ['A'..'Z','a'..'z']
- FChar = Filler character for End-of-String
- *)
-
- (* When called, prompt should be on screen. NewIn var will be modified only
- at exit of ReadS, otherwise will return nothing. If ESC is pressed, NewIn
- will again be blank, otherwise will contain the user input or default
- string.
-
-
- ** NOTE ** There are certain functions required to make this entire
- procedure work. They are not necessary, but make it nicer to
- use. These are:
-
- GetCursor
- SetCursor
- WriteS (fast writes to screen, see next few posts)
-
- *)
-
- (* Standard disclaimer: I'm not liable for anything this procedure does
- outside the original purpose of the procedure. If
- something bad happens, let me know, but that's all
- I can do.
- *)
-
- Var
- CurX, StLen : Byte;
- OldCursor : Word;
-
- Begin
- NewIn := '';
- InsOn := True;
- InStr := OldIn;
- StLen := Length (OldIn);
- Colr := CheckColor (Colr);
- For I := StLen To MaxLen-1 Do
- WriteS (FChar,X+I,Y,Colr);
- WriteS (OldIn,X,Y,HiColr);
- CurX := Length (InStr)+X;
- ValidChars := ValidChars + [#8,#13,#210,#211] + HKeySet + FuncKeys;
- {arrowk OldCursor := GetCursor;
- Repeat
- If InsOn Then
- SetCursor (DefaultCursor)
- Else
- SetCursor (BlockCursor);
- GotoXY (CurX,Y);
- StLen := Length (InStr);
- For I := StLen To MaxLen-1 Do
- If Colr < 112 Then
- WriteS (FChar,X+I,Y,HiColr)
- Else
- WriteS (FChar,X+I,Y,Colr);
- Repeat
- Repeat
- Ch := ReadKey;
- Until (Ch <> #13) Or ((Ch = #13) And (InStr <> ''));
- Until (Ch In ValidChars);
- Case Ch Of
- #8:
- Begin
- If (CurX > X) And (Length (InStr) > 0) Then
- Begin
- Dec (CurX);
- If InsOn Then
- Delete (InStr,(CurX-X)+1,1)
- Else
- InStr[(CurX-X)+1] := #32;
- End;
- End;
- #203: { Left arrow }
- If CurX > X Then
- Dec (CurX);
- #205: { Right arrow }
- If CurX < X+Length (InStr) Then
- Inc (CurX);
- #199: { Home }
- CurX := X;
- #207: { End }
- CurX := X+Length (InStr);
- #210: { Insert }
- InsOn := InsOn XOr True;
- #211: { Delete }
- Delete (InStr,(CurX-X)+1,1);
- #65..#90,
- #97..#122, { Alphabet }
- #48..#57, { Numbers }
- #91..#96,
- #32..#47,
- #58..#64: { Other chars }
- Begin
- If (CurX-X < MaxLen) And (Length (InStr) < MaxLen) Then
- Begin
- InStr[0] := Chr (Ord (InStr[0])+1);
- InStr[Length (InStr)] := #0;
- If InsOn Then
- Insert (Ch,InStr,(CurX-X)+1)
- Else
- InStr[(CurX-X)+1] := Ch;
- Inc (CurX);
- End;
- End;
- End;
- While Pos (#0,InStr) > 0 Do
- Delete (InStr,Pos (#0,InStr),1);
- WriteS (InStr,X,Y,Colr);
- Until (Ch = #13) Or (Ch = #27);
- For I := Length (InStr) To MaxLen-1 Do
- WriteS (#32,I+X,Y,7);
- If Ch = #27 Then
- NewIn := ''
- Else
- NewIn := InStr;
- SetCursor (OldCursor);
- End;